#include "../mqserver/mq_queue.hpp"
#include <gtest/gtest.h>

mq::MsgQueueManager::ptr mqmp;

class QueueTest : public testing::Environment{
public:
    virtual void SetUp() override{
        mqmp = std::make_shared<mq::MsgQueueManager>("./date/meta1.db");
        if(mqmp.get()== nullptr)
            DLOG("创建失败");
    }
    virtual void TearDown() override{
        // mqmp->clear();//去除所有数据库
        // DLOG("清除完成");
    }
};

// TEST(queue_test,insert_test){
//     //创建map的值给到队列的args
//     std::unordered_map<string,string> map = {{"k1","v1"}};
//     //1. 创建 插入4 个 队列
//     //对于之前已存在的值就会不会插入，配合之前删除的也就是重新生成交换机3，并且没有map数据
//     mqmp->declareQueue("queue1",true,false,false,map);
//     mqmp->declareQueue("queue2",true,false,false,map);
//     mqmp->declareQueue("queue3",true,false,false,map);
//     mqmp->declareQueue("queue4",true,false,false,map);

//     // 2. 使用ASSERET_EQ 判断 size 是否 等于4
//     ASSERT_EQ(mqmp->size(),4);
// }

TEST(exchange_test,select_test){

//第二次测试用的：判断queue是否真的被删除：
    ASSERT_EQ(mqmp->exists("queue1"),false);
    ASSERT_EQ(mqmp->exists("queue2"),false);
    ASSERT_EQ(mqmp->exists("queue3"),true);
    ASSERT_EQ(mqmp->exists("queue4"),true);


    //1. 测试查询，因为查询会返回一个交换机所以可以创建一个局部的交换机进行接收
    // mq::MsgQueue::ptr exp = mqmp->selectQueue("queue1");
    mq::MsgQueue::ptr exp = mqmp->selectQueue("queue3");//因为第一次测试 queue1已经被删了所以查2 

    //2. 判断交换机是否查询成功，如果exp为空表示查询失败
    //使用 ASSERT_NE 判断不等，若不等则则返回true，反之相等返回false
    ASSERT_NE(exp.get(),nullptr);//指针 要不等与 null 才正确，所以使用NE

    //3. 判断查询到的交换机数据和查询的交换机3的数据全部对应
    ASSERT_EQ(exp->name,"queue3");
    ASSERT_EQ(exp->durable,true);
    ASSERT_EQ(exp->auto_delete,false);
    ASSERT_EQ(exp->exclusive,false);
    DLOG("%s",exp->getArgs().c_str())
    ASSERT_EQ(exp->getArgs(),"k1=v1&");
}

TEST(exchange_test,remove_test){
    //删除交换机3
    mqmp->deleteQueue("queue3");
    //在创建局部交换机，通过mqmp查询交换机，通过查看查询结果判断是否删除成功
    mq::MsgQueue::ptr exp = mqmp->selectQueue("queue3");

    ASSERT_EQ(mqmp->exists("queue3"),false);//判断交管局是否还存在
}


//测试交换机的使用
int main(int argc,char* argv[]){
    testing::InitGoogleTest(&argc,argv);
    testing::AddGlobalTestEnvironment(new QueueTest);

    RUN_ALL_TESTS();

    return 0;
}